#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int Maxn=5005,mod=1e9+7;
int n,k;
int w[Maxn];
int a[Maxn];
int head[Maxn],to[Maxn<<1],nxt[Maxn<<1],cnt1;
inline void add(int u,int v){
	to[++cnt1]=v;nxt[cnt1]=head[u];
	head[u]=cnt1;
}


inline int ksm(int a,int k){
	int res=1;
	for(;k;k>>=1,a=a*a%mod)if(k&1)res=res*a%mod;
	return res;
}
int fac[Maxn],inv[Maxn];
inline int C(int n,int m){
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
inline void init(){
	fac[0]=1;
	for(int i=1;i<=5000;i++)fac[i]=fac[i-1]*i%mod;
	inv[5000]=ksm(fac[5000],mod-2);
	for(int i=5000;i;i--)inv[i-1]=inv[i]*i%mod;
}

int h[5005][5005],g[Maxn];

vector<int>G[Maxn];

int f[1<<11][Maxn];

int fa[Maxn],vis[Maxn],si[Maxn];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main(){
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	n=read();k=read();
	init();
	for(int i=1;i<=k;i++)w[i]=read();
	g[0]=1;
	h[1][1]=1;g[1]=1;
	for(int i=2;i<=n;i++){
		for(int j=1;j<=i;j++){
			h[i][j]=(h[i-1][j-1]+h[i-1][j]*j)%mod;
			g[i]=(g[i]+h[i][j])%mod;
		}
	}
	
	
	for(int i=1;i<=n;i++){
		int l=read();
		while(l--){
			int x=read();
			a[i]+=(1<<x-1);
		}
		for(int s=0;s<(1<<k);s++){
			if((s&a[i])==a[i])G[s].push_back(i);
		}
	}
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	
	int ans=0;
	
	for(int s=1;s<(1<<k);s++){
		for(int i=1;i<=n;i++)fa[i]=i,vis[i]=si[i]=0;
		for(int x:G[s])vis[x]=1;
		for(int x:G[s]){
			for(int o=head[x];o;o=nxt[o]){
				int y=to[o];
				if(vis[y])fa[find(x)]=find(y);
			}
		}
		
		for(int i:G[s])si[find(i)]++;
		for(int x:G[s]){
			if(find(x)==x){
				for(int j=1;j<=si[x];j++)f[s][j]=(f[s][j]+C(si[x],j))%mod;
			}
		}
		for(int j=1;j<=n;j++){
			for(int s1=0;s1<s;s1++){
				if((s&s1)==s1)f[s][j]=(f[s][j]+mod-f[s1][j])%mod;
			}
			
//			printf("f[%d][%d]=%d\n",s,j,f[s][j]);
			
			ans=(ans+f[s][j]*g[n-j]%mod*w[__builtin_popcount(s)])%mod;
		}
	}
	
//	for(int i=1;i<=n;i++)printf("g[%d]=%d\n",i,g[i]);
	
	printf("%lld\n",ans);
	return 0;
}
/*
3 3
1 2 4
1 1
1 2
1 3
1 2
2 3
*/
